跳到主要内容

Git 分支与提交树管理

基本的分支操作

默认的主分支:master

git branch -v # 显示分支

git branch 名称 # 创建分支

git checkout 分支名称 # 切换分支

git branch -d 分支名称 # 删掉分支

或者直接使用组合命令

# 创建分支并直接切换至这个分支
git checkout -b 名称

选择当前使用的分支

# 当前使用 master 分支
git checkout master

checkout 的两个常用的参数

-f 即 --force 切换分支时,即使索引或工作树与 HEAD 不同,也要继续,这会丢弃本地更改。
-b 用于生成一个新的分支

选择父提交记录

操作符 ^~ 符一样,后面也可以跟一个数字。

但是该操作符后面的数字与 ~ 后面的不同,并不是用来指定向上返回几代,而是指定合并提交记录的某个父提交。

还记得前面提到过的一个合并提交有两个父提交吧,所以遇到这样的节点时该选择哪条路径就不是很清晰了。

Git 默认选择合并提交的 “第一个” 父提交,在操作符 ^ 后跟一个数字可以改变这一默认行为。

如下所示:

这里有一个合并提交记录。如果不加数字修改符直接 checkout master^,会回到第一个父提交记录。

在我们的图示中,第一个父提交记录是指合并提交记录正上方的那个提交记录。

这里执行

git checkout master^

他会默认选择自己上面那个父节点

但是如果执行的是

git checkout master^2

他会选择另一边的那个父节点

这个命令还支持链式操作,如下所示:

执行:

git checkout HEAD~^2~2

在提交树上移动

HEAD 指针

先看一下 “HEAD”。 HEAD 是一个对当前 checkout 记录的符号引用 —— 也就是 指向你正在其基础上进行工作的提交记录

HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。

HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见。

git checkout c1
git checkout master
git commit
git checkout c2

通过以上命令可以改变 HEAD 的指向

注意:以上的 c1 其实是 commit 提交的哈希码,下同

HEAD 指向了 master,随着提交向前移动。

如果想看 HEAD 指向,可以通过 cat .git/HEAD 查看,如果 HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向。

cat .git/HEAD

# ref: refs/heads/master

分离的 HEAD

分离的 HEAD 就是 让其指向了某个具体的提交记录而不是分支名

在命令执行之前的状态如下所示:

# HEAD 指向 master, master 指向 C1
HEAD -> master -> C1

执行 git checkout c1

# 可以发现直接指向 c1 这个 commit
HEAD -> C1

想让这个 HEAD 指针回归,只需直接切换到任意分支(checkout 命令)就行了

相对引用(^)

通过指定提交记录哈希值的方式在 Git 中移动不太方便。在实际应用时,并没有漂亮的可视化提交树供你参考,所以你就不得不用 git log 来查查看提交记录的哈希值。

并且哈希值在真实的 Git 世界中也会更长,不过比较令人欣慰的是,Git 对哈希的处理很智能,只需要提供能够唯一标识提交记录的前几个字符即可。

通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。这个就很厉害了!

使用相对引用的话,你就可以从一个易于记忆的地方(比如 bugFix 分支或 HEAD)开始计算。

相对引用非常给力,这里我介绍两个简单的用法:

  • 使用 ^ 向上移动 1 个提交记录
  • 使用 ~<num> 向上移动多个提交记录,如 ~3

首先看看操作符 ^,把这个符号加在引用名称的后面,表示让 Git 寻找指定提交记录的父提交。

所以 master^ 相当于 “master 的父节点”。

master^^ 是 master 的第二个父节点

如下所示:

这里执行:

git checkout master^

这样就把 HEAD 指针 c1

也可以将 HEAD 作为相对引用的参照。下面咱们就用 HEAD 在提交树中向上移动几次。

git checkout c3
git checkout HEAD^
git checkout HEAD^
git checkout HEAD^

相对引用2(~)

如果你想在提交树中向上移动很多步的话,敲那么多 ^ 貌似也挺烦人的,Git 当然也考虑到了这一点,于是又引入了操作符 ~

该操作符后面可以跟一个数字(可选,不跟数字时与 ^ 相同,向上移动一次),指定向上移动多少次。

git checkout HEAD~4

强制修改分支位置

可以直接使用 -f 选项让分支指向另一个提交

git branch -f master HEAD~3

上面的命令会将 master 分支强制指向 HEAD 的第 3 级父提交。相对引用为我们提供了一种简洁的引用提交记录 C1 的方式, 而 -f 则容许我们将分支强制移动到那个位置。

References